#include "Codec.h"

Codec::Codec(Message *msg) { reLoad(msg); }
Codec::Codec(string msg) { reLoad(msg); }

// 序列化: 得到结构体数据的序列化形式
string Codec::encodeMsg() {
    _obj.SerializeToString(&_msg);
    return _msg;
}

// 反序列化: 得到结构体数据的智能指针
shared_ptr<Message> Codec::decodeMsg() {
    _obj.ParseFromString(_msg);
    Message* msg = new Message;
    msg->_userName = _obj.username();
    msg->_roomName = _obj.roomname();
    msg->_data1 = _obj.data1();
    msg->_data2 = _obj.data2();
    msg->_data3 = _obj.data3();
    msg->_reqCode = _obj.reqcode();
    msg->_resCode = _obj.rescode();

    // 将结构体msg委托给智能指针进行管理
    shared_ptr<Message> pointer(msg, [this](Message* ptr){
        delete ptr;
        cout << "Message被析构了..." << endl;
    });
    return pointer;
}

// 加载[新的_msg]
void Codec::reLoad(string msg) { _msg = msg; }

// 加载[新的结构体数据] -> 加载[新的_obj]
void Codec::reLoad(Message *msg) {
    _obj.set_username(msg->_userName);
    _obj.set_roomname(msg->_roomName);
    _obj.set_data1(msg->_data1);
    _obj.set_data2(msg->_data2);
    _obj.set_data3(msg->_data3);
    _obj.set_reqcode(msg->_reqCode);
    _obj.set_rescode(msg->_resCode);
}
